<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    
  </style>
</head>
<body>
  
</body>
<script>

  // some
  // 遍历数组
  // 回调函数，回调函数有三个形参：
    // 形参1：数据
    // 形参2：索引
    // 形参3：数组自身
  // 布尔值：回调函数每次执行时，只要有一个返回true，some的返回值即为true，并停止遍历
  // 否
  // var arr = [5,6,7,8,9];
  // console.log(arr);
  // var res = arr.some( function(val, idx, self){
  //   console.log(val, idx,self, self === arr);
  //   return false;
  // } )
  // console.log(arr);
  // console.log(res);


  // every
  // 遍历数组
  // 回调函数，回调函数有三个形参：
    // 形参1：数据
    // 形参2：索引
    // 形参3：数组自身
  // 布尔值：回调函数每次执行时，只要有一个返回false，every的返回值即为false，并停止遍历
  // 否
  // var arr = [5,6,7,8,9];
  // console.log(arr);
  // var res = arr.every( function(val, idx, self){
  //   console.log(val, idx,self, self === arr);
  //   return true;
  // } )
  // console.log(arr);
  // console.log(res);




  // ============


  // reduce
  // 归并
  // 参数：
    // 实参1：回调函数，回调函数有四个形参：
      // 形参1：
        // 没有实参2时：
          // 第一次回调函数执行时，表示数组第一个数据
          // 之后回调函数每次执行时，表示前一次回调函数的返回值
      // 形参2：
        // 没有实参2时：回调函数每次执行时从数组的第二个数据开始获取的每个数据
      // 形参3：当前回调函数遍历到的数据索引（跟随形参2）
      // 形参4：正在遍历的数组
  // 返回值：最后一次回调函数的返回值


  // var arr = ["a", 124, true, "b", 6];
  // console.log(arr);
  // var res = arr.reduce( function(prev, val, idx, self){
  //   console.log(prev, val, idx, self, self === arr);
  //   return val;
  // } );
  // console.log(arr);
  // console.log(res);

  // 回调函数执行4次
  // 第一次：prev：a，val：124，返回：124
  // 第二次：prev：124，val：true，返回：true
  // 第三次：prev：true，val：b，返回：b
  // 第四次：prev：b，val：6，返回：6
  // reduce的返回值：6






  // reduce
  // 归并
  // 参数：
    // 实参1：回调函数，回调函数有四个形参：
      // 形参1：
        // 有实参2时：
          // 第一次回调函数执行时，表示实参2
          // 之后回调函数每次执行时，表示前一次回调函数的返回值
      // 形参2：
        // 有实参2时：回调函数每次执行时从数组的第一个数据开始获取的每个数据
      // 形参3：当前回调函数遍历到的数据索引（跟随形参2）
      // 形参4：正在遍历的数组

    // 实参2：可选，第一次回调函数的形参1，是形参1的初始值

  // 返回值：最后一次回调函数的返回值

  // var arr = ["a", 124, true, "b", 6];
  // console.log(arr);
  // var res = arr.reduce( function(prev, val, idx, self){
  //   console.log(prev, val);
  //   return val;
  // }, "hello" );
  // console.log(arr);
  // console.log(res);

  // 回调函数执行了5次
  // 第一次：prev：hello，val：a，返回：a
  // 第二次：prev：a，val：124，返回：124
  // 第三次：prev：124，val：true，返回：true
  // 第四次：prev：true，val：b，返回b
  // 第五次：prev：b，val：6，返回6
  // reduce返回值是：6


  // reduce的使用
  // 快速计算数组中所有数据的和
  // var arr = [4, 5, 6, 7, 8];
  // var sum = arr.reduce(function(prev, val){
  //   return prev + val;
  // })
  // console.log(sum);

  var arr = [{
    name:"张三",
    math: 89,
    sex: "男"
  },{
    name:"李四",
    math: 76,
    sex: "女"
  },{
    name:"王二",
    math: 91,
    sex: "女"
  },{
    name:"赵五",
    math: 68,
    sex: "男"
  }];
  // 要求：所有人的数学总成绩
  var sum = arr.reduce(function(prev,val){
    return prev + val.math;
  }, 0);
  console.log(sum);
  
  // 要求：男生的数学总成绩
  var sum2 = arr.reduce(function(prev,val){
    return prev + (val.sex==="男" ? val.math : 0);
  }, 0);
  console.log(sum2);
  



</script>
</html>